//配置路由的地方
import Vue from 'vue';
//引入vue-router路由插件
import VueRouter from 'vue-router';
//
import routes from './routes.js'
//引入store
import store from '@/store'
//使用插件
Vue.use(VueRouter)
//先把VueRouter原型对象的push,先保存一份
let originPush = VueRouter.prototype.push;
let originReplace = VueRouter.prototype.replace

// 重写push与replace
// 第一个参数：告诉原来的push方法，往哪儿跳转，传递哪些参数
// 第二个参数：成功的回调
// 第三个参数：失败的回调
//call与apply区别
//相同点，都可以调用函数一次，都可以篡改函数的上下文一次
//不同点，call与apply传递参数，call传递参数用逗号隔开，apply方法执行，传递数组
VueRouter.prototype.push = function (location, resolve, reject) {
    if (resolve && reject) {
        originPush.call(this, location, resolve, reject)
    } else {
        originPush.call(this, location, () => { }, () => { })
    }
}
VueRouter.prototype.replace = function (location, resolve, reject) {
    if (resolve && reject) {
        originReplace.call(this, location, resolve, reject)
    } else {
        originReplace(this, location, () => { }, () => { })
    }
}

//配置路由
let router = new VueRouter({
    //配置路由
    routes,
    scrollBehavior(to, from, savedPosition) {
        // 始终滚动到顶部
        return { y: 0 }
    },
});

//全局守卫，前置守卫（路由跳转之前判断）
router.beforeEach(async (to, from, next) => {
    //to:获取到要跳转到的路由
    //from:获取到从哪个路由跳转
    //next:next()放行   next(path)放行到指定路由  next(false)
    // next();
    //用户登陆了，才有token
    let token = store.state.user.token
    //仓库中的用户数据
    let name = store.state.user.userInfo.name
    if (token) {
        //用户已经登录还想去login(停留在首页)
        if (to.path == '/login') {
            next('/home')
        } else {
            //登陆了，但去的不是login[home|search|detail|shopcart]
            //如果用户名已有
            if (name) {
                next();
            } else {
                try {
                    //没有用户信息,派发action让仓库存储用户信息
                    await store.dispatch('getUserInfo')
                    next();
                } catch (error) {
                    //token失效,获取不到用户信息，重新登录
                    //清除token
                    await store.dispatch('userLogout')
                    next('/login')
                }
            }
        }
    } else {
        //未登录不能去交易相关页面,不能去个人中心
        //转到登录
        let toPath = to.path;
        if (toPath.indexOf('/trade') != -1 || toPath.indexOf('/pay') != -1 || toPath.indexOf('/center') != -1) {
            //把未登录时想去而没去成的信息存储在地址栏中
            next('/login?redirect=' + toPath)
        } else {
            //去到非以上路由  放行
            next();
        }

    }

});

export default router;